package com.example.weather_app.core;

import static java.nio.charset.StandardCharsets.UTF_8;

import android.content.Context;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Network {
    private final CitySearch citySearch;  // 用于查询城市ID的工具类

    // 构造函数：传入 Context 初始化 CitySearch
    public Network(Context context) {
        this.citySearch = new CitySearch(context);  // 假设 CitySearch 已适配 Android（使用 assets/res/raw 读取）
    }

    /**
     * 根据城市名获取天气数据
     * @param cityName 城市名称（如 "北京"）
     * @return 封装后的天气数据对象
     * @throws JSONException 数据解析异常
     * @throws IOException 网络请求异常
     */
    public WeatherData getWeatherData(String cityName) throws JSONException, IOException {
        // 1. 查询城市对应的ID
        String cityId = citySearch.getCityId(cityName);
        if ("未找到该城市ID".equals(cityId)) {
            throw new IllegalArgumentException("未找到城市: " + cityName);
        }

        // 2. 拼接动态URL（替换原固定城市ID）
        String url = "http://t.weather.itboy.net/api/weather/city/" + cityId;
        StringBuilder sb = new StringBuilder();

        // 3. 发起网络请求
        try {
            URL u = new URL(url);
            URLConnection con = u.openConnection();
            con.setConnectTimeout(5000);  // 连接超时5秒
            con.setReadTimeout(5000);     // 读取超时5秒

            // 读取响应数据
            try (InputStreamReader in = new InputStreamReader(con.getInputStream(), UTF_8);
                 BufferedReader br = new BufferedReader(in)) {
                String inputLine;
                while ((inputLine = br.readLine()) != null) {
                    sb.append(inputLine);
                }
            }

            // 4. 解析JSON数据（与原逻辑一致）
            JSONObject json = new JSONObject(sb.toString());
            if (!"200".equals(json.getString("status"))) {  // API返回非成功状态码
                throw new IOException("API请求失败: " + json.getString("message"));
            }

            JSONObject data = json.getJSONObject("data");

            // 解析未来7天预报
            List<ForecastDayData> forecastList = new ArrayList<>();
            JSONArray forecastArray = data.getJSONArray("forecast");
            int daysToShow = Math.min(7, forecastArray.length()); // 最多取7天

            for (int i = 0; i < daysToShow; i++) {
                JSONObject dayJson = forecastArray.optJSONObject(i); // 先获取 JSONObject，默认值为 null
                if (dayJson == null) {
                    // 处理无效的 JSON 对象（如数组元素非 JSONObject）
                    forecastList.add(new ForecastDayData(
                            "未知日期", "未知", "未知", "0℃", "0℃", "无", "0级", "数据解析失败",
                            "未知日落时间","未知日出时间"
                    ));
                    continue;
                }

                ForecastDayData day = new ForecastDayData(
                        dayJson.optString("ymd", "未知日期"),       // 日期，默认值 "未知日期"
                        dayJson.optString("week", "未知"),          // 星期，默认值 "未知"
                        dayJson.optString("type", "未知天气"),       // 天气类型，默认值 "未知天气"
                        dayJson.optString("low", "0℃"),             // 低温，默认值 "0℃"
                        dayJson.optString("high", "0℃"),            // 高温，默认值 "0℃"
                        dayJson.optString("fx", "无风向"),           // 风向，默认值 "无风向"
                        dayJson.optString("fl", "0级"),             // 风力，默认值 "0级"
                        dayJson.optString("notice", "暂无提示"),      // 提示，默认值 "暂无提示"
                        dayJson.optString("sunset", "日落未知"),
                        dayJson.optString("sunrise", "日出未知")
                );
                forecastList.add(day);
            }
// 解析实时数据（同样使用 opt 方法）
            return new WeatherData(
                    data.optString("wendu", "-"),              // 当前温度，默认值 "-"
                    data.optString("shidu", "0%"),             // 湿度，默认值 "0%"
                    data.optString("quality", "未知"),          // 空气质量，默认值 "未知"
                    data.optDouble("pm25", -1.0),              // PM2.5，默认值 -1.0（表示未获取到）
                    data.optString("ganmao", "暂无健康提示"),   // 健康提示，默认值 "暂无健康提示"
                    forecastList
            );

        } catch (IOException | JSONException e) {
            throw new IOException("天气数据获取失败: " + e.getMessage());
        }
    }
}